'use strict';
const fs = require('fs');
const ora = require('ora');
const chalk = require('chalk');
const path = require('./path');
const { stat } = fs;

// 复制黏贴
const copy = function(src, dst) {
    // 读取目录中的所有文件/目录
    fs.readdir(src, function(err, paths) {
        if(err) throw err;
        paths.forEach(function( path ){
            let _src = src + '/' + path,
                _dst = dst + '/' + path,
                readable, writable;
            stat( _src, function(err, st) {
                if(err) throw err;
                // 判断是否为文件(管道操作大型文件)
                if(st.isFile()) {
                    // 创建读取流
                    readable = fs.createReadStream( _src );
                    // 创建写入流
                    writable = fs.createWriteStream( _dst );   
                    // 通过管道来传输流
                    readable.pipe( writable );
                }
                // 如果是目录则递归调用自身
                else if(st.isDirectory()) {
                    exists( _src, _dst, copy );
                }
            });
        });
    });
};

// 在复制目录前需要判断该目录是否存在，不存在需要先创建目录，存在抛出错误
const exists = function(src, dst, callback) {
    return new Promise(res => {
        // 判断拷贝目录是否存在
        fs.exists(src, function(exists) {
            // 已存在
            if(exists) {
                // 判断目标路径是否存在
                fs.exists(dst, function(exists) {
                    // 已存在
                    if(exists) {
                        callback(src, dst);
                        res();
                    }
                    // 不存在
                    else {
                        fs.mkdir(dst, function() {
                            callback(src, dst);
                            res();
                        });
                    }
                });
            }
            // 不存在
            else {
                res();
            }
        });
    });
};

// 写入cli
module.exports = (name, useAnswers) => {
    const spinner = ora(' 开始创建cli目录...').start();
    return new Promise(async function(res) {
        // 创建cli
        await exists(`${path.rootPath}${path.cli()}`, `${name}`, copy);
        // 创建默认组件
        await exists(`${path.rootPath}${path.cachePath}/default`, `${name}/template`, copy);
        // 创建可选组件
        await exists(`${path.rootPath}${path.cachePath}/choice`, `${name}/template`, copy);
        spinner.stop();
        console.log(chalk.green("cli写入完成！"));
        res();
    });
};